/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.core.view.mbean;

import com.brain.conf.dto.AlmacenDto;
import com.brain.conf.dto.MonedaDto;
import com.brain.conf.manager.AlmacenManager;
import com.brain.conf.manager.MonedaManager;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ArchivoDto;
import com.brain.core.dto.EmpresaDto;
import com.brain.core.dto.OrganizacionAlmacenDto;
import com.brain.core.dto.OrganizacionDetaDto;
import com.brain.core.dto.OrganizacionDto;
import com.brain.core.dto.UbigeoDto;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.ArchivoManager;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.OrganizacionAlmacenManager;
import com.brain.core.manager.OrganizacionDetaManager;
import com.brain.core.manager.OrganizacionManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.manager.UbigeoManager;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("organizacionMBean")
@Scope("session")
public class OrganizacionMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(OrganizacionMBean.class);
    @Resource
    private OrganizacionManager manager;
    @Resource
    private MonedaManager monedaManager;
    @Resource
    private OrganizacionDetaManager detaManager;
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private ArchivoMBean archivoMBean;
    @Resource
    private ArchivoManager archivoManager;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private OrganizacionAlmacenManager organizacionAlmacenManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    private List<OrganizacionDto> lista;
    private OrganizacionDto dto;
    private OrganizacionDetaDto detaDto;
    private OrganizacionDto dtoFiltro;
    private String keyEntidad = "key.entidad.organizacion";
    private String keyDetaEntidad = "key.entidad.sub.organizacion";
    private List<UbigeoDto> listaPaises;
    private String tituloDetalle;
    private List<MonedaDto> listaMonedas;
    private SelectItem[] siTipoSubOrganizacion;
    private List<AlmacenDto> listaAlmacenes;
    private OrganizacionAlmacenDto organizacionAlmacenDto;
    private List<OrganizacionAlmacenDto> listaOrgAlmacen;
    private Boolean validarSubOrganizacion = Boolean.FALSE;
    private Boolean validarSubAlmacen = Boolean.FALSE;

    public OrganizacionMBean() {
        this.dtoFiltro = new OrganizacionDto();
    }

    public String iniciar() {
        this.lista = null;
        this.dto = null;
        this.detaDto = null;
        this.organizacionAlmacenDto = null;
        this.dtoFiltro = new OrganizacionDto();
        this.dtoFiltro.setEmpresaDto(new EmpresaDto(sessionMBean.getSessionUsuarioDto().getEmpresa()));
        this.dtoFiltro.setDescripcion("");
        this.dtoFiltro.setEstado(Boolean.TRUE);
        return manager.getUrlLista();
    }

    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.inicializar();
        this.detaDto = this.detaManager.inicializar();
        return manager.getUrl();
    }

    public void nuevaSubOrganizacion() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetaEntidad, sessionMBean.getAccionDetalle());
        this.detaDto = this.detaManager.inicializar();
        this.detaDto.setOrganizacionDto(this.dto);
        this.detaDto.setPaisDto(this.dto.getPaisDto());
    }

    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.detaDto = this.detaManager.inicializar();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
            this.dto.setComentario("");
        } catch (DAOException ex) {
            logger.error(ex);
        }
        return manager.getUrl();
    }

    public void editarSubOrganizacion() {
        this.tituloDetalle = recursosManager.construirTitulo(keyDetaEntidad, sessionMBean.getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        this.organizacionAlmacenDto = this.organizacionAlmacenManager.inicializar(this.detaDto);
        AlmacenManager m = (AlmacenManager) WebServletContextListener.getApplicationContext().getBean("almacenManager");
        
        try {
            this.detaDto = detaManager.obtenerPorId(this.detaDto.getId());
            this.listaAlmacenes =  m.obtenerAlmacenesActivosPorOrganizacion(this.dto);
            this.listaOrgAlmacen = organizacionAlmacenManager.obtenerLista(this.detaDto);            
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }
    
    public void eliminarAlmacen(){
        try {
            this.organizacionAlmacenManager.eliminar(this.organizacionAlmacenDto);            
            this.listaOrgAlmacen = organizacionAlmacenManager.obtenerLista(this.detaDto);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.detaDto = this.detaManager.inicializar();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
        return manager.getUrl();
    }

    public void verSubOrganizacion() {
        this.tituloDetalle = recursosManager.construirTitulo(keyDetaEntidad, sessionMBean.getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        try {
            this.detaDto = detaManager.obtenerPorId(this.detaDto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    public String gestionFeriados() {
        FeriadoOrganizacionMBean feriadoOrganizacionMBean = (FeriadoOrganizacionMBean) WebServletContextListener.getApplicationContext().getBean("feriadoOrganizacionMBean");
        return feriadoOrganizacionMBean.iniciar(dto);
    }

    public void buscar() {
        try {
            this.lista = this.manager.obtener(this.dtoFiltro);
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
    }

    public String guardar() {
        if (manager.guardar(this.dto) != null) {
            this.editar();
        }
        return null;
    }

    public void guardarSubOrganizacion() {
        try {
            if (detaManager.guardar(detaDto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());
            }
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
    }
    
    public void guardarAlmacen(){
        try {            
            organizacionAlmacenDto.getOrganizacionDetaDto().setId(this.detaDto.getId());
                boolean flag = false;
                for (OrganizacionAlmacenDto orgAlmDto: this.listaOrgAlmacen){
                    if (orgAlmDto.getAlmacenDto().getNombre().equals(organizacionAlmacenDto.getAlmacenDto().getNombre())){
                        flag = true;
                    }
                }
                if (!flag){
                    organizacionAlmacenManager.nuevo(organizacionAlmacenDto);
                }
                else{
                    this.recursosManager.showError("EL ALMACÉN: " + organizacionAlmacenDto.getAlmacenDto().getNombre() + 
                            ", YA SE ENCUENTRA REGISTRADO");
                }
            
            if(organizacionAlmacenDto.getId()!=null){
                organizacionAlmacenDto = organizacionAlmacenManager.inicializar(this.detaDto);
            }
            this.listaOrgAlmacen = organizacionAlmacenManager.obtenerLista(this.detaDto);
        } catch (Exception ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public String verBitacora() {

        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    public String verBitacoraDetalle() {
        bitacoraManager.cargarBitacoraEntidad(detaManager.getIdEntidad(), this.detaDto.getId());
        return null;
    }

    public void verArchivo() {
        archivoManager.viewArchivoHtml(this.dto.getArchivoLogoDto().getNombre());
    }

    public void listenerFile(FileUploadEvent event) {

        UploadedFile file = event.getFile();

        ArchivoDto archivoDto = new ArchivoDto();
        archivoDto.setEsAtributo(Boolean.TRUE);
        archivoDto.setNombre(file.getFileName());
        archivoDto.setTipoDto(null);
        archivoDto.setPeso(BigDecimal.valueOf(file.getSize()));
        archivoDto.setComentario("LOGO DE EMPRESA");
        archivoDto.setBites(file.getContents());
        archivoDto.setDetalle(archivoDto.getNombre());
        archivoDto.setEstado(Boolean.TRUE);
        if (archivoDto.getNombre().indexOf(".") != -1) {
            archivoDto.setExtension(archivoDto.getNombre().substring(archivoDto.getNombre().lastIndexOf(".") + 1, archivoDto.getNombre().length()));
        }

        this.dto.setArchivoLogoDto(archivoDto);
    }

    public void listenerFileDeta(FileUploadEvent event) {

        UploadedFile file = event.getFile();

        ArchivoDto archivoDto = new ArchivoDto();
        archivoDto.setEsAtributo(Boolean.TRUE);
        archivoDto.setNombre(file.getFileName());
        archivoDto.setTipoDto(null);
        archivoDto.setPeso(BigDecimal.valueOf(file.getSize()));
        archivoDto.setComentario("LOGO DE EMPRESA");
        archivoDto.setBites(file.getContents());
        archivoDto.setDetalle(archivoDto.getNombre());
        archivoDto.setEstado(Boolean.TRUE);
        if (archivoDto.getNombre().indexOf(".") != -1) {
            archivoDto.setExtension(archivoDto.getNombre().substring(archivoDto.getNombre().lastIndexOf(".") + 1, archivoDto.getNombre().length()));
        }

        this.detaDto.setArchivoLogoDto(archivoDto);
    }

    public String verArchivos() {
        sessionMBean.setEntidad(manager.getIdEntidad());
        sessionMBean.setRegistro(this.dto.getId());
        archivoMBean.cargarArchivos();

        return null;
    }

    public String verArchivosDetalle() {
        sessionMBean.setEntidad(detaManager.getIdEntidad());
        sessionMBean.setRegistro(this.detaDto.getId());
        archivoMBean.cargarArchivos();

        return null;
    }

    public String retroceder() {
        return manager.getUrlLista();
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        OrganizacionMBean.logger = logger;
    }

    public OrganizacionManager getManager() {
        return manager;
    }

    public void setManager(OrganizacionManager manager) {
        this.manager = manager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<OrganizacionDto> getLista() {
        return lista;
    }

    public void setLista(List<OrganizacionDto> lista) {
        this.lista = lista;
    }

    public OrganizacionDto getDto() {
        return dto;
    }

    public void setDto(OrganizacionDto dto) {
        this.dto = dto;
    }

    public OrganizacionDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(OrganizacionDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public OrganizacionDetaDto getDetaDto() {
        return detaDto;
    }

    public void setDetaDto(OrganizacionDetaDto detaDto) {
        this.detaDto = detaDto;
    }

    public List<UbigeoDto> getListaPaises() {
        UbigeoManager m = (UbigeoManager) WebServletContextListener.getApplicationContext().getBean("ubigeoManager");
        try {
            return m.obtenerPaisesActivosPorEmpresa();
        } catch (DAOException ex) {
            logger.error(ex);
            return new ArrayList<UbigeoDto>();
        }
    }

    public void setListaPaises(List<UbigeoDto> listaPaises) {
        this.listaPaises = listaPaises;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public List<MonedaDto> getListaMonedas() throws DAOException {
        listaMonedas = monedaManager.obtenerMonedasActivasPorEmpresa();
        return listaMonedas;
    }

    public void setListaMonedas(List<MonedaDto> listaMonedas) {
        this.listaMonedas = listaMonedas;
    }

    public SelectItem[] getSiTipoSubOrganizacion() {
        return detaManager.siTiposSubOrganizacion();
    }

    public void setSiTipoSubOrganizacion(SelectItem[] siTipoSubOrganizacion) {
        this.siTipoSubOrganizacion = siTipoSubOrganizacion;
    }

    public List<AlmacenDto> getListaAlmacenes() {
        return listaAlmacenes;
    }

    public void setListaAlmacenes(List<AlmacenDto> listaAlmacenes) {
        this.listaAlmacenes = listaAlmacenes;
    }

    public OrganizacionAlmacenDto getOrganizacionAlmacenDto() {
        return organizacionAlmacenDto;
    }

    public void setOrganizacionAlmacenDto(OrganizacionAlmacenDto organizacionAlmacenDto) {
        this.organizacionAlmacenDto = organizacionAlmacenDto;
    }

    public List<OrganizacionAlmacenDto> getListaOrgAlmacen() {
        return listaOrgAlmacen;
    }

    public void setListaOrgAlmacen(List<OrganizacionAlmacenDto> listaOrgAlmacen) {
        this.listaOrgAlmacen = listaOrgAlmacen;
    }

    public Boolean getValidarSubOrganizacion() {
        return validarSubOrganizacion;
    }

    public void setValidarSubOrganizacion(Boolean validarSubOrganizacion) {
        this.validarSubOrganizacion = validarSubOrganizacion;
    }

    public Boolean getValidarSubAlmacen() {
        return validarSubAlmacen;
    }

    public void setValidarSubAlmacen(Boolean validarSubAlmacen) {
        this.validarSubAlmacen = validarSubAlmacen;
    }
}
